More debugging tweaks for dg-100.
authorrobertl <robertl>
Sun, 2 Sep 2007 21:36:50 +0000 (21:36 +0000)
committerrobertl <robertl>
Sun, 2 Sep 2007 21:36:50 +0000 (21:36 +0000)
dg-100.c

index 96c9ffed6ba5c7b43808c1d6d85ede7b23371d0f..f5ff786358d89b98f63213e8e822cccb42c49729 100644 (file)
--- a/dg-100.c
+++ b/dg-100.c
@@ -59,18 +59,19 @@ struct dg100_command {
        int  sendsize;
        int  recvsize;
        int  trailing_bytes;
+       const char *text;       /* Textual description for debugging */
 };
 
 struct dg100_command dg100_commands[] = {
-       { dg100cmd_getconfig,      0,   44+2,    2 },
-       { dg100cmd_setconfig,     41,    4+2,    2 },
+       { dg100cmd_getconfig,      0,   44+2,    2, "getconfig" },
+       { dg100cmd_setconfig,     41,    4+2,    2, "setconfig"  },
        /* the getfileheader answer has variable length, -1 is a dummy value */
-       { dg100cmd_getfileheader,  2,   -1  ,    2 },
-       { dg100cmd_getfile,        2, 1024+2,    2 },
-       { dg100cmd_erase,          2,    4+2,    2 },
-       { dg100cmd_getid,          0,    8+2,    2 },
-       { dg100cmd_setid,          8,    4+2,    2 },
-       { dg100cmd_gpsmouse,       1,    0  ,    0 }
+       { dg100cmd_getfileheader,  2,   -1  ,    2, "getfileheader"  },
+       { dg100cmd_getfile,        2, 1024+2,    2, "getfile" },
+       { dg100cmd_erase,          2,    4+2,    2, "erase" },
+       { dg100cmd_getid,          0,    8+2,    2, "getid" },
+       { dg100cmd_setid,          8,    4+2,    2, "setid" },
+       { dg100cmd_gpsmouse,       1,    0  ,    0, "gpsmouse" }
 };
 const unsigned dg100_numcommands = sizeof(dg100_commands) / sizeof(dg100_commands[0]);
 
@@ -150,19 +151,35 @@ bintime2utc(int date, int time)
 static void 
 dg100_debug(const char *hdr, int include_nl, size_t sz, unsigned char *buf)
 {
-   int i;
+       int i;
 
-   if (global_opts.debug_level < 1) return;
+       /* Only give byte dumps for higher debug levels */
+       if (global_opts.debug_level < 5) {
+               return;
+       }
 
-   fprintf(stderr, "%s", hdr);
-   
-   for (i = 0; i < sz; i++)  {
-       fprintf(stderr, "%02x ", buf[i]);
-   }
+       fprintf(stderr, "%s", hdr);
+
+       for (i = 0; i < sz; i++)  {
+               fprintf(stderr, "%02x ", buf[i]);
+       }
 
-   if (include_nl) {
-       fprintf(stderr, "\n");
-   }
+       if (include_nl) {
+               fprintf(stderr, "\n");
+       }
+}
+
+static void
+dg100_log(const char *fmt, ...)
+{
+       va_list ap;
+       va_start (ap, fmt);
+       if (global_opts.debug_level < 1) {
+               return;
+       }
+       
+       vfprintf(stderr, fmt, ap);
+       va_end(ap);
 }
 
 
@@ -287,7 +304,16 @@ dg100_send(gbuint8 cmd, const void *payload, size_t count)
        be_write16(frame + framelen - 2, 0xB0B3);
 
        n = gbser_write(serial_handle, frame, framelen);
-        dg100_debug(n == 0 ? "Sent: " : "Error Sending:", 1, framelen, frame);
+
+       if (global_opts.debug_level) {
+               struct dg100_command *cmdp = dg100_findcmd(cmd);
+
+               dg100_debug(n == 0 ? "Sent: " : "Error Sending:", 
+                       1, framelen, frame);
+               dg100_log("TX: Frame Start %02x %02x Payload_Len %04x Cmd: %s\n", 
+                       frame[0], frame[1], payload_len, cmdp->text);
+       }
+       
        if (n == gbser_ERROR) {
                fatal("dg_100_send: write failed\n");
        }
@@ -326,10 +352,10 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload)
 
        /* consume input until frame head sequence 0xA0A2 was received */
        frame_head = 0;
-        dg100_debug("Receiving ", 0, 0, NULL);
+       dg100_debug("Receiving ", 0, 0, NULL);
        do {
                c = dg100_recv_byte();
-               dg100_debug("", 0, 1, &c);
+               dg100_debug("", 0, 1, &c);
                frame_head <<= 8;
                frame_head |= c;
 
@@ -358,7 +384,7 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload)
        /* read Payload Length, Command ID, and two further bytes */
        for (i = 2; i < 7; i++) {
                buf[i] = dg100_recv_byte();
-               dg100_debug("", 0, 1, &buf[i]);
+               dg100_debug("", 0, 1, &buf[i]);
        }
 
        payload_len_field = be_read16(buf + 2);
@@ -407,7 +433,7 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload)
         * read the rest of the frame at once using gbser_read_wait(). */
        for (i = 7; i < frame_len; i++) {
                buf[i] = dg100_recv_byte();
-               dg100_debug("", 0, 1, &buf[i]);
+               dg100_debug("", 0, 1, &buf[i]);
        }
 
        frame_start_seq   = be_read16(buf + 0);
@@ -416,8 +442,11 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload)
        payload_checksum  = be_read16(buf + frame_len - 4);
        frame_end_seq     = be_read16(buf + frame_len - 2);
 
-        /* calculate checksum */
-        sum = dg100_checksum(buf + 4, frame_len - 8);
+       dg100_log("RX: Start %04x Len %04x Cmd: %s\n",
+               frame_start_seq, payload_len_field, cmdinfo->text);
+
+       /* calculate checksum */
+       sum = dg100_checksum(buf + 4, frame_len - 8);
        if (sum != payload_checksum) {
                fatal("checksum mismatch: data sum is 0x%04x, checksum received is 0x%04x\n",
                                sum, payload_checksum);
@@ -516,11 +545,15 @@ dg100_getfileheaders(struct dynarray16 *headers)
                h = dynarray16_alloc(headers, numheaders);
                for (i = 0; i < numheaders; i++) {
                        offset = 4 + i * 12;
-                       //time   = be_read32(answer + offset);
-                       //date   = be_read32(answer + offset + 4);
                        seqnum = be_read32(answer + offset + 8);
-                       //ti = bintime2utc(date, time);
                        h[i] = seqnum;
+                       if (global_opts.debug_level) {
+                               int time   = be_read32(answer + offset);
+                               int date   = be_read32(answer + offset + 4);
+                               time_t ti = bintime2utc(date, time);
+                               dg100_log("Header #%d: Seq: %d Time: %s", 
+                                       i, seqnum, ctime(&ti));
+                       }
                }
        } while (numheaders != 0);
 }